package com.coderitl.springmvc.handle;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.Date;

/**
 * 实现的接口方法有默认方法
 */
public class MyInterceptor implements HandlerInterceptor {
    /**
     * preHandle: 预先处理请求的方法
     * 参数:
     *      Object handler 被拦截的控制器对象(自定义的xxxController)
     * 返回值: boolean
     *      为true的执行结果: 也说明请求是正确的 可以被 controller 处理的
     *          ************** preHandle ****************
     *          controller...
     *          ************** postHandle ****************
     *          ************** afterCompletion ****************
     *      false: 请求不能被处理,控制器方法不会被执行,请求到此截至
     *          ************** preHandle ****************
     * 特点:
     *      1. 预处理方法它的执行时间,在控制器方法之前先执行的
     *      2. 可以对请求做处理,可以做登录检查,权限的判断,统计数据等等
     *      3. 决定请求是否执行
     */
    @Override
    public boolean preHandle(HttpServletRequest request,
                             HttpServletResponse response,
                             Object handler) throws Exception {
        System.out.println("************** preHandle ****************");
        return true;
    }

    /**
     * postHandle: 后处理方法
     * 参数:
     *      Object handler 被拦截的控制器对象(自定义的xxxController)
     *      ModelAndView modelAndView: 控制器方法的返回值(xxxController<= 请求的执行结果)
     * 特点:
     *      1. 在控制器方法之后执行的
     *      2. 能获取到控制器方法的执行结果,可以修改原来的执行结果,可以修改数据,也可以修改视图
     *      3. 可以做对请求的二次处理
     */
    @Override
    public void postHandle(HttpServletRequest request,
                           HttpServletResponse response,
                           Object handler,
                           ModelAndView modelAndView) throws Exception {
        System.out.println("************** postHandle ****************");
        // 修改数据
        if(modelAndView!=null){
            // 原始数据: ModelAndView [view="show"; model={uname=coder-itl, age=12}]
            System.out.println(modelAndView);
            modelAndView.addObject("uname","里斯");
            modelAndView.addObject("age","12");

            // 修改数据
            modelAndView.addObject("date",new Date());
            // 修改视图
            modelAndView.setViewName("other");
        }
    }

    /**
     * afterCompletion: 最后执行的方法
     * 参数:
     *   Object handler:  被拦截的控制器对象(自定义的xxxController)
     *   Exception ex: 异常对象
     * 特点:
     *      1. 在请求处理完成后执行的 请求处理完成的标志是"视图处理完成"对视图执行 forward 操作后
     *      2. 可以做程序最后要做的工作,释放内存,清理临时变量
     *      3. 方法的执行条件:
     *          1. 当前的拦截器它的 preHandle() 方法必执行
     *          2. preHandle() 必须返回 true
     *
     *
     */
    @Override
    public void afterCompletion(HttpServletRequest request,
                                HttpServletResponse response,
                                Object handler,
                                Exception ex) throws Exception {
        System.out.println("************** afterCompletion ****************");
        // 获取临时数据 tempData
        HttpSession session = request.getSession();
        Object tempData = session.getAttribute("tempData");
        System.out.println("get temp data: "+tempData);
        // 清理该数据
        session.removeAttribute("tempData");
        // 确定是否删除
        Object twoGet = session.getAttribute("tempData");
        System.out.println("second get temp data : "+twoGet);
    }
}
